﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using DataServer.DAO;
using DataServer.DTO;
using DataServer.SalaryCalculation;

namespace DataServer.Models
{
    public class DataHelper
    {
        private NhanVienCTL _nhanVienCTL;
        private PhongBanCTL _phongBanCTL;
        private NghiPhepCTL _nghiPhepCTL;
        private TableCTL _tableCTL;

        private static object synLock = new object();

        //Nen su dung mau singleton de tao 1 lan daos
        public DataHelper()
        {
            _nhanVienCTL = new NhanVienCTL();
            _phongBanCTL = new PhongBanCTL();
            _nghiPhepCTL = new NghiPhepCTL();
            _tableCTL = new TableCTL();
        }

        //NHAN VIEN
        public List<NhanVienDTO> getDsNhanVien()
        {
            return _nhanVienCTL.getDsNhanVien();
        }

        public NhanVienDTO getNhanVien(int id)
        {
            return _nhanVienCTL.getNhanVien(id);
        }

        public bool UpdateNhanvien(int id, NhanVienDTO newInfo)
        {
            _nhanVienCTL.NhanVien = newInfo;
            return _nhanVienCTL.update(id);
        }

        public bool DeleteNhanVien(int id)
        {
            NhanVienDTO nv = new NhanVienDTO();
            nv.MANV = id;
            _nhanVienCTL.NhanVien = nv;
            return _nhanVienCTL.delete();
        }

        public bool AddNewNhanVien(NhanVienDTO newNhanVien)
        {
            _nhanVienCTL.NhanVien = newNhanVien;
            return _nhanVienCTL.insert();
        }

        public int calculateSalary(int id)
        {
            try
            {
                NhanVienDTO nv = _nhanVienCTL.getNhanVien(id);
                int soThanNhan = nv.SoThanNhan;
                _nhanVienCTL.SetSalaryCalculator(new MonthBasedCalculation(soThanNhan));
                return _nhanVienCTL.calculateSalary();
            }
            catch (Exception)
            {
                
                throw;
            }            
        }

        public int calculateSalary(int id, int month, int year)
        {
            int soNgayNghi = this.getSoNgayNghiCuaNhanVien(id, month, year);
            _nhanVienCTL.SetSalaryCalculator(new DayBasedCalculation(month, year, soNgayNghi));
            return _nhanVienCTL.calculateSalary();
        }

        // PHONG BAN
        public List<PhongBanDTO> getDsPhongBan()
        {
            return _phongBanCTL.getDsPhongBan();
        }

        public PhongBanDTO getPhongBan(string id)
        {
            return _phongBanCTL.getPhongBan(id);
        }

        public bool AddNewPhongBan(PhongBanDTO phg)
        {
            _phongBanCTL.PhongBan = phg;
            return _phongBanCTL.insert();
        }

        public bool DeletePhongBan(string id)
        {
            PhongBanDTO phg = new PhongBanDTO();
            phg.MAPHG = id;
            _phongBanCTL.PhongBan = phg;
            return _phongBanCTL.delete();
        }

        public bool UpdatePhongBan(string id, PhongBanDTO phg)
        {
            _phongBanCTL.PhongBan = phg;
            return _phongBanCTL.update(id);
        }


        //---------------NGHI PHEP---------
        public List<NghiPhepDTO> getDsNgayNghi()
        {
            return _nghiPhepCTL.getDsNgayNghi();
        }

        public NghiPhepDTO getNgayNghi(int id)
        {
            return _nghiPhepCTL.getNgayNghi(id);
        }

        public List<NghiPhepDTO> getDsNgayNghiCuaNhanVien(int maNV)
        {
            return _nghiPhepCTL.getDsNgayNghiCuaNhanVien(maNV);
        }

        public List<NghiPhepDTO> getDsNgayNghi(int maNV, int thang, int nam)
        {
            return _nghiPhepCTL.getDsNgayNghi(maNV, thang, nam);
        }

        public bool addNewNghiPhep(NghiPhepDTO np)
        {
            _nghiPhepCTL.Info = np;
            return _nghiPhepCTL.insert();
        }

        public bool deleteNghiPhep(int id)
        {
            NghiPhepDTO info = new NghiPhepDTO()
            {
                ID = id
            };

            _nghiPhepCTL.Info = info;
            return _nghiPhepCTL.delete();
        }

        public bool updateNghiPhep(int id, NghiPhepDTO newInfo)
        {
            _nghiPhepCTL.Info = newInfo;
            return _nghiPhepCTL.update(id);
        }

        public int getSoNgayNghiCuaNhanVien(int id, int month, int year)
        {
            List<NghiPhepDTO> lNgayNghi = _nghiPhepCTL.getDsNgayNghi(id, month, year);
            int total = 0;

            for (int i = 0; i < lNgayNghi.Count; i++)
            {
                total += lNgayNghi[i].SoNgayNghi;
            }

            return total;
        }

        //-----------------------------------------------------------
        public List<string> getAllTableNames()
        {
            return _tableCTL.getAllTableNames();
        }

        public List<string> getColumnNames(string tableName)
        {
            return _tableCTL.getAllColumnNames(tableName);
        }
    }
}